// 导航守卫
import router from '@/router'
import store from '@/store'
import { Message } from 'element-ui'

// 全局前置守卫
router.beforeEach(async(to, from, next) => {
  const time = localStorage.getItem('time')
  const maxTime = 90000
  const now = Date.now()
  // 如果token超时
  if (time && now - time > maxTime) {
    localStorage.removeItem('time')
    Message.error('超时，请重新登录')
    store.commit('user/logout')
    next('/login')
  }
  // to 目标地址, from 来源地址, next 放行回调函数
  // 导航守卫跟拦截器一样, 拦住了记得要放行
  // 通过vuex user token可以知道当前登录状态
  const token = store.state.user.token
  if (token) {
    // 已登录
    // 人资当中有个可选的功能, 如果已经登录不能再进入登录页
    if (to.path === '/login') {
      // 1 登录以后还去登录页 -> 跳回首页
      next('/')
    } else {
      // 2 登录以后进入登录页以外页面 -> 放行
      // 在进入页面的时候，如果发现用户数据不存在
      // 就要调用 action 获取数据
      const username = store.state.user.userInfo.username
      if (!username) {
        // 先等待个人数据拿完之后，再继续往下走 （promise）
        await store.dispatch('user/getUserInfo')
      }
      next()
    }
  } else {
    // 未登录跳到登录页
    // 如果你本来就是去登录页, 应该放行
    // 否则才跳到登录页
    // if (to.path === '/login' || to.path === '/404' || to.path === '/testpage')
    // 上面 or 写法有点复杂, 可以用白名单思路实现, 如果找得到下标, 那么就是数组中字符串其中一个
    const pathArray = ['/login', '/404', '/index']
    if (pathArray.indexOf(to.path) !== -1) {
      next()
    } else {
      next('/login')
    }
  }
})
